// 引入 Schedule 类型
import type Schedule from '../entity/Schedule';

/**
 * 引入 Vue 的响应式 API `ref`，用于创建响应式数据引用。
 * 响应式数据可以在数据变化时自动更新视图。
 */
import { ref } from 'vue';

/**
 * 引入 Pinia 的 `defineStore` 函数，用于定义状态管理仓库。
 * Pinia 是 Vue 的现代状态管理库，提供了类型安全和组合式 API。
 */
import { defineStore } from 'pinia';

/**
 * 定义一个名为 `schedule` 的 Pinia 状态管理仓库。
 * 该仓库用于管理日程列表的状态，包括获取、添加、删除和更新日程。
 *
 * @returns 包含日程列表状态和操作方法的对象。
 */
export const useScheduleStore = defineStore('schedule', () => {

  // 从本地存储中获取日程列表，如果没有则初始化为空数组
  // 使用 `ref` 创建响应式数据，以便在数据变化时更新视图
  const scheduleList = ref<Schedule[]>(localStorage.getItem('scheduleList') ? JSON.parse(localStorage.getItem('scheduleList')!) : []);

  /**
   * 获取当前的日程列表。
   *
   * @returns 当前的日程列表数组。
   */
  const getScheduleList = (): Schedule[] => {
    return scheduleList.value;
  };

  /**
   * 向日程列表中添加一个新的日程。
   * 自动生成新日程的唯一标识，并将其添加到日程列表中。
   *
   * @param schedule 不包含 `id` 的日程对象。
   */
  const addSchedule = (schedule: Omit<Schedule, 'id'>) => {
    // 生成新的日程 ID，取当前列表中最大的 ID 加 1，如果列表为空则为 1
    const newId = scheduleList.value.length > 0 ? Math.max(...scheduleList.value.map(item => item.id)) + 1 : 1;
    const newSchedule: Schedule = {
      ...schedule,
      id: newId
    };
    // 将新日程添加到日程列表中
    scheduleList.value.push(newSchedule);
    localStorage.setItem('scheduleList', JSON.stringify(scheduleList.value));
  };

  /**
   * 根据日程的唯一标识删除一个日程。
   * 过滤掉日程列表中与指定 ID 匹配的日程。
   *
   * @param id 要删除的日程的唯一标识。
   */
  const deleteSchedule = (id: number) => {
    scheduleList.value = scheduleList.value.filter(schedule => schedule.id !== id);
    localStorage.setItem('scheduleList', JSON.stringify(scheduleList.value));
  };

  /**
   * 清空所有日程
   */
  const clearSchedule = (): void => {
    scheduleList.value = [];
    localStorage.setItem('scheduleList', JSON.stringify(scheduleList.value));
  }

  /**
   * 根据日程的唯一标识更新一个日程。
   * 找到匹配的日程并替换为新的日程对象。
   *
   * @param updatedSchedule 包含新信息的完整日程对象。
   */
  const updateSchedule = (updatedSchedule: Schedule) => {
    // 找到要更新的日程在列表中的索引
    const index = scheduleList.value.findIndex(schedule => schedule.id === updatedSchedule.id);
    if (index !== -1) {
      // 如果找到则更新该日程
      scheduleList.value[index] = updatedSchedule;
    }
    localStorage.setItem('scheduleList', JSON.stringify(scheduleList.value));
  };

  // 返回仓库的状态和方法，供组件使用
  return {
    scheduleList,
    getScheduleList,
    addSchedule,
    deleteSchedule,
    clearSchedule,
    updateSchedule
  };
});